<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>函数参数的默认值</title>
</head>
<body>
  <script>
    /*
    * 基本用法
    * 1. ES6允许为函数的参数设置默认值，直接写在参数定义的后面
    * 2. 参数变量是声明的所以不能用const和let进行再次声明，否则会报错
    * 3. 使用参数默认值时，函数不能有同名参数
    */

    // // ES6之前 如果y为false，则该赋值不起作用
    // function log(x,y){
    //   y = y || 'world'
    //   console.log(x,y)
    // }
    // log('hello') // hello world
    // log('hello', '哈哈') // hello 哈哈
    // log('hello', false) // hello world 如果值为false则将不起作用
    // // ES6写法
    // function foo(x = 5, y= 'world') {
    //   console.log(x, y)
    // }
    // foo('hello') // hello world
    // foo('hello', '哈哈') // hello 哈哈
    // foo('hello', false) // hello false 如果值为false则将不起作用

    // // 已有默认值的将不能用const、let再重复声明
    // function foo(x=5) {
    //   // const x = 6 //Uncaught SyntaxError
    //   // let x = 6 //Uncaught SyntaxError
    //   var x = 6
    // }
    // foo()

    // // 使用参数默认值时，函数不能有同名参数
    // function foo (x,x,y = 5){}// Uncaught SyntaxError: Duplicate parameter name not allowed in this context
    
    /*
    * 与解构赋值默认值结合使用
    */

    // function foo({x,y=5}){
    //   console.log(x,y)
    // }
    // foo({})  // undefined 5
    // foo({x:1}) // 1 5
    // foo({x:1,y:3}) // 1 3
    // foo() //Uncaught TypeError

    // 如果没有参数则boo函数的参数默认为一个空对象
    // function boo({x,y=5} = {}) {
    //   console.log(x,y)
    // }
    // boo() //undefined 5

    /*
    * 参数默认值的位置
    * 1.定义了默认值的参数，应该是函数的尾参数
    */
    // function f(x=1,y) {
    //   console.log([x,y]) 
    // }
    // f()  // [1, undefined]
    // f(2) // [2, undefined]
    // // f(,1)//报错
    // f(undefined,1) // [1, 1]

    /*
    * 函数的length属性
    * 1. 制定默认值后，函数的length属性将返回没有制定默认值的参数的个数
    */

    console.log((function (a) {}).length)// 1
    console.log((function (a = 5) {}).length) // 0
    console.log((function (a, b, c = 5) {}).length) // 2

    /*
    * 作用域
    * 
    */
  </script>
</body>
</html>